/*
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang.reflect;

/**
 * TypeVariable 是各种类型变量的通用超接口。
 * 类型变量在反射方法首次需要时创建，如本包中所指定的。
 * 如果类型变量 t 被类型（即类、接口或注解类型）T 引用，
 * 且 T 由 T 的第 n 个封闭类声明（参见 JLS 8.1.2），
 * 则创建 t 需要解析（参见 JVMS 5）T 的第 i 个封闭类，
 * 其中 i = 0 到 n（包含）。创建类型变量不得导致创建其边界。
 * 重复创建类型变量不会产生任何效果。
 *
 * <p>在运行时可能会实例化多个对象来表示给定的类型变量。
 * 尽管类型变量只创建一次，但这并不意味着需要缓存表示类型变量的实例。
 * 但是，表示类型变量的所有实例必须彼此 equal()。
 * 因此，类型变量的用户不得依赖实现此接口的类的实例的标识。
 *
 * @param <D> 声明底层类型变量的泛型声明的类型。
 *
 * @since 1.5
 */
public interface TypeVariable<D extends GenericDeclaration> extends Type, AnnotatedElement {
    /**
     * 返回表示此类型变量上界的 {@code Type} 对象数组。
     * 请注意，如果没有显式声明上界，则上界为 {@code Object}。
     *
     * <p>对于每个上界 B：<ul> <li>如果 B 是参数化类型或类型变量，
     * 则创建它（有关参数化类型创建过程的详细信息，
     * 请参见 {@link java.lang.reflect.ParameterizedType ParameterizedType}）。
     * <li>否则，解析 B。</ul>
     *
     * @throws TypeNotPresentException 如果任何边界引用不存在的类型声明
     * @throws MalformedParameterizedTypeException 如果任何边界引用
     *     由于任何原因无法实例化的参数化类型
     * @return 表示此类型变量上界的 {@code Type} 数组
    */
    Type[] getBounds();

    /**
     * 返回表示声明此类型变量的泛型声明的 {@code GenericDeclaration} 对象。
     *
     * @return 为此类型变量声明的泛型声明。
     *
     * @since 1.5
     */
    D getGenericDeclaration();

    /**
     * 返回此类型变量在源代码中出现的名称。
     *
     * @return 此类型变量在源代码中出现的名称
     */
    String getName();

    /**
     * 返回 AnnotatedType 对象数组，这些对象表示用于表示此 TypeVariable
     * 所代表的类型参数上界的类型的使用。
     * 数组中对象的顺序对应于类型参数声明中边界的顺序。
     *
     * 如果类型参数未声明边界，则返回长度为 0 的数组。
     *
     * @return 表示类型变量上界的对象数组
     * @since 1.8
     */
     AnnotatedType[] getAnnotatedBounds();
}
